package gbench.sandbox.record.protein;

import org.junit.jupiter.api.Test;

import gbench.commonApp.jdbc.IJdbcApp;
import lombok.Data;
import lombok.NoArgsConstructor;

import static gbench.common.tree.LittleTree.IRecord.*;

import java.time.LocalDateTime;

import static gbench.common.tree.LittleTree.*;

/**
 * 信息技术 就是 思维逻辑的 生物化学<br>
 * IRecord 数据结构 就是 信息蛋白 <br>
 * 
 * 数据化工的思想 <br>
 * 
 * IRecord 提供一种数据 加工的中间原料。我把它视为一种 数据蛋白（概念） <br>
 * 设计思路就是采用 化学的思想 从IRecord中提取相应的物质。<br>
 * 
 * 这是一种 把 IRecord 视为 化合物(蛋白质）的思想。每个 key 代表 中元素（或者是功能基团）<br>
 * 即：基本类型 就是 原子 其他类型 就是 功能基团。<br>
 * <br>
 * 一个 IRecord 就是个 data protein ,信息蛋白<br>
 * 
 * @author gbench
 *
 */
public class JunitDataProtein {
    
    @Test
    public void foo() {
        
        final var excel = IJdbcApp.loadExcel(file, this.getClass()); // 加载读入excel
        final var mx = excel.autoDetect(0); // 读取表格sheet
        
        System.out.println(mx);
    }
    
    /**
     * 一个概念 就像一个 思想蛋白,使用  static 确保这是一个 可以被 进行反射 来构造对象实例的类对象。<br>
     * <br>
     * 单个人概念（消费者）
     * @author gbench
     *
     */
     @Data @NoArgsConstructor
     final static class Individual{
         private String name;
         private String sex;
         private LocalDateTime birth;
     }
    
    /**
     * 一个概念 就像一个 思想蛋白,使用  static 确保这是一个 可以被 进行反射 来构造对象实例的类对象。 <br>
     * <br>
     * 地址概念
     * @author gbench
     *
     */
     @Data @NoArgsConstructor
     final static class Address{
         private String province;
         private String city;
         private String district;
         private String street;
         private String building;
         private String room;
     }
    
   /**
    * 一个概念 就像一个 思想蛋白,使用  static 确保这是一个 可以被 进行反射 来构造对象实例的类对象。 
    * 产品概念
    * @author gbench
    *
    */
    @Data @NoArgsConstructor
    final static class Product{
        private Integer id;
        private String name;
        private LocalDateTime date;
        private Address origin;
    }
    
    /**
     * 一个概念 就像一个 思想蛋白,使用  static 确保这是一个 可以被 进行反射 来构造对象实例的类对象。 <br>
     * <br>
     * 订单概念
     * @author gbench
     *
     */
    @Data @NoArgsConstructor
    final static class Order{
        private Individual owner;
        private Product product;
        private double price;
    }
    
    @Test
    public void bar() {
        final var excel = IJdbcApp.loadExcel(file, this.getClass()); // 加载读入excel
        final var mx = excel.autoDetect("product"); // 读取表格sheet
        final var aa = mx.mapByRow(IRecord::REC).toArray(IRecord[]::new);
        
        TUPLES(cph2(aa,aa).map(e->e.add(REC("weight",Math.random()*1000))))
        .forEach(tup->{// 构造出一个数据关系网
            final var e = tup._2();
            final var a = e.rec(0).mutate(Product.class);// 第一种方法
            final var b = e.get(1,(IRecord rec)->rec.mutate(Product.class));// 第二种方法
            final var weight = e.dbl("weight"); // 提取
            System.out.println(MFT("{0,number,#}\t{1}--->{2} \t weight:{3}",tup._1()+1,a,b,weight));
        });
    }
    
    @Test
    public void qux() {
       final var addr_builder = IRecord.builder("province,city,district,street,building,room");// 地址构建器
       final var rec = REC(// 生成记录结构
           "owner",REC("name","张三","sex","男","birth",LocalDateTime.now()),
           "product",REC("id",1,"name","葡萄",
               "date",LocalDateTime.now(),
               "origin",addr_builder.get("上海市/上海市/长宁区/法华镇路/111弄22号/303".split("/"))),
           "price",REC("value",25)); 
       final var order = rec.mutate(Order.class);
       System.out.println(order);
    }
    
    final String file = 
        // "C:/Users/gbench/Desktop/protein.xlsx";// 随便的一个excel文件,用来标识数据源的思想
        "protein.xlsx";
}
